//
//  LBRouter.h
//  LBRouter
//
//  Created by WuShiHai on 19/5/24.
//  Copyright (c) 2019 Lebbay. All rights reserved.
//

#import <Foundation/Foundation.h>

extern NSString *const LBRouterParameterURL;
extern NSString *const LBRouterParameterCompletion;
extern NSString *const LBRouterParameterUserInfo;
extern NSString *const LBRouterExtractParameterUserInfo;

//RouterTypeNativeCallback
extern NSString *const LBRouterNativeCallbackShare;
extern NSString *const LBRouterNativeCallbackRefresh;

#import "LBRouterTypeDefine.h"
#import "LBLabel+Router.h"
#import "LBRouterDefine.h"
#import "LBRouterConfigurationHeader.h"
#import "NSObject+LBRouter.h"
#import "UIViewController+LBRouter.h"
#import "LBRouterHandler.h"
#import "LBRouterHandler+Native.h"

@interface LBRouter : NSObject

#pragma clang diagnostic push
#pragma clang diagnostic ignored"-Wdocumentation"

/**
 *  注册 URLPattern 对应的 Handler，在 handler 中可以初始化 VC，然后对 VC 做各种操作
 *
 *  @param URLPattern 带上 scheme，如 lebbay://beauty/:id
 *  @param handler    该 block 会传一个字典，包含了注册的 URL 中对应的变量。
 *                    假如注册的 URL 为 lebbay://beauty/:id 那么，就会传一个 @{@"id": 4} 这样的字典过来
 */
+ (void)registerURLPattern:(NSString *)URLPattern toHandler:(LBRouterResultHandler)handler;

/**
 注册 多个URLPattern 对应的 同一Handler，在 handler 中可以初始化 VC，然后对 VC 做各种操作

 @param URLPatterns 带上 scheme，如 lebbay://beauty/:id
 @param handler 该 block 会传一个字典，包含了注册的 URL 中对应的变量。
 *                    假如注册的 URL 为 lebbay://beauty/:id 那么，就会传一个 @{@"id": 4}
 */
+ (void)registerURLPatterns:(NSArray<NSString *> *)URLPatterns toHandler:(LBRouterResultHandler)handler;

/**
 *  注册 URLPattern 对应的 ObjectHandler，需要返回一个 object 给调用方
 *
 *  @param URLPattern 带上 scheme，如 lebbay://beauty/:id
 *  @param handler    该 block 会传一个字典，包含了注册的 URL 中对应的变量。
 *                    假如注册的 URL 为 lebbay://beauty/:id 那么，就会传一个 @{@"id": 4} 这样的字典过来
 *                    自带的 key 为 @"url" 和 @"completion" (如果有的话)
 */
+ (void)registerURLPattern:(NSString *)URLPattern toObjectHandler:(LBRouterObjectHandler)handler;

/**
 *  取消注册某个 URL Pattern
 *
 *  @param URLPattern
 */
+ (void)deregisterURLPattern:(NSString *)URLPattern;

/**
 *  打开此 URL
 *  会在已注册的 URL -> Handler 中寻找，如果找到，则执行 Handler
 *
 *  @param URL 带 Scheme，如 lebbay://beauty/3
 */
+ (void)openURL:(NSString *)URL;

/**
 *  打开此 URL，同时当操作完成时，执行额外的代码
 *
 *  @param URL        带 Scheme 的 URL，如 lebbay://beauty/4
 *  @param completion URL 处理完成后的 callback，完成的判定跟具体的业务相关
 */
+ (void)openURL:(NSString *)URL completion:(LBRouterOpenURLCompleteHandler)completion;

/**
 *  打开此 URL，带上附加信息，同时当操作完成时，执行额外的代码
 *
 *  @param URL        带 Scheme 的 URL，如 lebbay://beauty/4
 *  @param parameters 附加参数
 *  @param completion URL 处理完成后的 callback，完成的判定跟具体的业务相关
 */
+ (void)openURL:(NSString *)URL withUserInfo:(NSDictionary *)userInfo completion:(LBRouterOpenURLCompleteHandler)completion;

/**
 *  打开此 URL，带上附加信息，同时当操作完成时，执行额外的代码
 *
 *  @param URL        带 Scheme 的 URL，如 lebbay://beauty/4
 *  @param parameters 附加参数
 *  @param isHandler 是否处理完链接后进行跳转等操作
 *  @param completion URL 处理完成后的 callback，完成的判定跟具体的业务相关
 */
+ (void)openURL:(NSString *)URL withUserInfo:(NSDictionary *)userInfo isHandler:(BOOL)isHandler completion:(LBRouterOpenURLCompleteHandler)completion;

/**
 * 查找谁对某个 URL 感兴趣，如果有的话，返回一个 object
 *
 *  @param URL
 */
+ (id)objectForURL:(NSString *)URL;

/**
 * 查找谁对某个 URL 感兴趣，如果有的话，返回一个 object
 *
 *  @param URL
 *  @param userInfo
 */
+ (id)objectForURL:(NSString *)URL withUserInfo:(NSDictionary *)userInfo;

/**
 *  是否可以打开URL
 *
 *  @param URL
 *
 *  @return
 */
+ (BOOL)canOpenURL:(NSString *)URL;

/**
 *  调用此方法来拼接 urlpattern 和 parameters
 *
 *  #define MGJ_ROUTE_BEAUTY @"beauty/:id"
 *  [LBRouter generateURLWithPattern:MGJ_ROUTE_BEAUTY, @[@13]];
 *
 *
 *  @param pattern    url pattern 比如 @"beauty/:id"
 *  @param parameters 一个数组，数量要跟 pattern 里的变量一致
 *
 *  @return
 */
+ (NSString *)generateURLWithPattern:(NSString *)pattern parameters:(NSArray *)parameters;




@end

@interface LBRouter (Helper)

/**
 获取一个链接中除了域名和参数部分
 e.g. lebbay://www.lebbay.com/account/phoneOperatorsCertified 得到 account/phoneOperatorsCertified
 /account/faceIdentify 得到 account/faceIdentify
 @param path 路径
 @return 处理后结果
 */
+ (NSString *)matchPathWithPath:(NSString *)path;

/**
 获取一个链接中除了域名和参数部分
 e.g. lebbay://www.lebbay.com/account/phoneOperatorsCertified 得到 account/phoneOperatorsCertified
 /account/faceIdentify 得到 account/faceIdentify
 @param URLString 链接
 @return 处理后结果
 */
+ (NSString *)matchPathWithURLString:(NSString *)URLString;

@end

#pragma clang diagnostic pop
